/** 
 *  @function (updata,amapPlugin,logout)
 *  @BASE_URL              统一管理请求地址(图片 上传 请求)
 *  @upImg                上传照片 统一请求方法
 *  @judgment             请求失败或成功 反馈用户
 *  @navTo                对应uni.navigateTo    统一方法
 *  @reTo                 对应uni.reLaunch      统一方法
 *  @back                 对应uni.navigateBack  统一方法
 *  @ALIPAY_PAY            APP端支付宝 支付       统一方法
 *  @WEIXIN_PAY               APP端微信  支付        统一方法
 *  @MP_WEIXIN_PAY            微信小程序  支付       统一方法
 *  @PHONE                正则 手机号            统一方法
 *  @nickName             正则 昵称              统一方法
 *  @transformTime        时间戳转年月日时分秒     统一方法
 *  @CALL                 拨打电话               统一方法
 *  @getkeyword           关键字查询位置          统一方法
 *  @getlocation          获取当前定位           统一方法
 *  @msg                  弹窗                 统一方法
 *  @WX                   微信授权只需调用方法即可 异步！！！ async await 接              统一方法
 *  @date                 获取时间格式为 MMM-YY-DD-HH ...                统一方法
 */

// 方法

import BASE_URL from '@/common/baseUrl'
import UPLOAD from '@/common/upload'
import api from '@/api/index'
import { PHONE, nickName } from '@/common/regular'
import { ALIPAY_PAY, WEIXIN_PAY, MP_WEIXIN_PAY } from '@/common/pay'
import MESSAGE from '@/common/message'
import WX_LOGIN from '@/common/WX'
import JUDGMENT from '@/common/judgment'
import { WXAddress, planningRoute, getaddress } from '@/common/address'
// 组件



/**
* @navToFn
* @param {string} url 
* url 路径
* 
*/

const navToFn = (url) => {
  uni.navigateTo({
    url
  })

}

/**
* @reToFn
* @param {string} url 
* url 路径
* 
*/

const reToFn = async (url) => {
  // 判断 是否为退出登录

  let im = RegExp('login')
  if (im.includes(url)) {

    // 为退出则请求接口 logout()
    const res = await api.logout()
    if (res.code !== 200) return
    uni.clearStorageSync()
    uni.reLaunch({
      url
    })
  } else {
    uni.reLaunch({
      url: url
    })
  }
}

/**
 * @backFn
 * @param {string|number} val 
 * val 返回第几层
 */

const backFn = (val) => {
  uni.navigateBack({
    delta: val
  })
}

/**
* @date
* @param {string} formatStr 
*  format YYYY-MM ... 
   this.$date('Week') = 获取今日星期
   this.$date('YYYY-MM') = 获取今日年月
   this.$date('YYYY-MM-DD') = 获取今日年月日
* 
*/

const date = (formatStr) => {
  var str = formatStr
  var Week = ['日', '一', '二', '三', '四', '五', '六']

  str = str.replace(/yyyy|YYYY/, new Date().getFullYear())
  str = str.replace(/yy|YY/, (new Date().getYear() % 100) > 9 ? (new Date().getYear() % 100).toString() : '0' + (new Date().getYear() % 100))

  str = str.replace(/MM/, new Date().getMonth() > 9 ? new Date().getMonth().toString() : '0' + (new Date().getMonth() + 1))
  str = str.replace(/M/g, new Date().getMonth())


  str = str.replace(/w|W/g, Week[new Date().getDay()])

  str = str.replace(/dd|DD/, new Date().getDate() > 9 ? new Date().getDate().toString() : '0' + new Date().getDate())
  str = str.replace(/d|D/g, new Date().getDate())

  str = str.replace(/hh|HH/, new Date().getHours() > 9 ? new Date().getHours().toString() : '0' + new Date().getHours())
  str = str.replace(/h|H/g, new Date().getHours())
  str = str.replace(/mm/, new Date().getMinutes() > 9 ? new Date().getMinutes().toString() : '0' + new Date().getMinutes())
  str = str.replace(/m/g, new Date().getMinutes())

  str = str.replace(/ss|SS/, new Date().getSeconds() > 9 ? new Date().getSeconds().toString() : '0' + new Date().getSeconds())
  str = str.replace(/s|S/g, new Date().getSeconds())

  return str

}


/**
* @transformTime
* @param {number , string} timestamp 
* timestamp 时间戳 , 转换什么类型
* 
*/

const transformTime = (timestamp = +new Date(), type = '年月日时分秒') => {
  if (timestamp) {
    var time = new Date(timestamp)
    var y = time.getFullYear() //getFullYear方法以四位数字返回年份
    var M = time.getMonth() + 1 // getMonth方法从 Date 对象返回月份 (0 ~ 11)，返回结果需要手动加一
    var d = time.getDate() // getDate方法从 Date 对象返回一个月中的某一天 (1 ~ 31)
    var h = time.getHours() // getHours方法返回 Date 对象的小时 (0 ~ 23)
    var m = time.getMinutes() // getMinutes方法返回 Date 对象的分钟 (0 ~ 59)
    var s = time.getSeconds() // getSeconds方法返回 Date 对象的秒数 (0 ~ 59)
    if (type == '年月日') return y + '-' + M + '-' + d
    if (type == '年月日时分秒') return y + '-' + M + '-' + d + ' ' + h + ':' + m + ':' + s
    if (type == '时分秒') return h + ':' + m + ':' + s

  } else {
    return ''
  }
}

/**
* @CALL
* @param {number|string} phone 
* 拨打电话 
*/

const CALL = (phone) => {
  if (!(/^1[3|4|5|7|8]\d{9}$/.test(phone))) return uni.showToast({
    title: '无法正常拨打此手机号',
    icon: 'none'
  })
  console.log('传入的电话', phone)
  const res = uni.getSystemInfoSync()

  // ios系统默认有个模态框
  if (res.platform == 'ios') {
    uni.makePhoneCall({
      phoneNumber: phone,

      success () {
        console.log('拨打成功了')
      },
      fail () {
        console.log('拨打失败了')
      }
    })
  } else {
    //安卓手机手动设置一个showActionSheet
    uni.showActionSheet({
      itemList: [phone, '呼叫'],
      success: function (res) {
        console.log(res)
        if (res.tapIndex == 1) {
          uni.makePhoneCall({
            phoneNumber: phone,
          })
        }
      }
    })
  }

}



// 获取位置
const getlocation = () => {
  return new Promise((resolve, reject) => {
    amapPlugin.getRegeo({
      success: (data) => {
        resolve(data)
      },
      fail: (err) => {
        reject(err)
      }
    })
  })

}


/**
 * 高德 API
* @getkeyword
* @param {string} keywords  
* @param {string} city  
* @param {string} citylimit  
* 关键字查询位置 
*/

const getkeyword = (keywords, city, citylimit) => {
  return new Promise((resolve, reject) => {
    amapPlugin.getInputtips({

      keywords,          // 关键字
      type: '',          // POI分类
      city,              // 搜索城市
      citylimit: city,   // 仅返回指定城市数据
      location: (data) => {
        resolve(data)
      },
      success: (data) => {
        resolve(data)
      },
      fail: (err) => {
        reject(err)
      }
    })
  })
}

const inall = (Vue) => {
  console.log('自定义的插件~')

  /**
   * 全局组件可使用uniapp自带 "easycom" 规则
   */



  /**
  * @type {any}  
  *  Vue.prototype.定义方法别名 = 定义的方法:any
  */

  // 全局方法。
  Vue.prototype.$navTo = navToFn
  Vue.prototype.$reTo = reToFn
  Vue.prototype.$back = backFn
  Vue.prototype.$BASE_URL = BASE_URL
  Vue.prototype.$ALIPAY_PAY = ALIPAY_PAY
  Vue.prototype.$WEIXIN_PAY = WEIXIN_PAY
  Vue.prototype.$MP_WEIXIN_PAY = MP_WEIXIN_PAY
  Vue.prototype.$WX_LOGIN = WX_LOGIN
  Vue.prototype.$nickName = nickName
  Vue.prototype.$PHONE = PHONE
  Vue.prototype.$Time = transformTime
  Vue.prototype.$CALL = CALL
  Vue.prototype.$getlocation = getlocation
  Vue.prototype.$getkeyword = getkeyword
  Vue.prototype.$MSG = MESSAGE
  Vue.prototype.$date = date
  Vue.prototype.$UPLOAD = UPLOAD
  Vue.prototype.$JUDGMENT = JUDGMENT
  Vue.prototype.$WX_ADDRESS = WXAddress
  Vue.prototype.$PLANNING_ROUTER = planningRoute
  Vue.prototype.$GET_GAODE__ADDRESS = getaddress



}
export default inall